// src/utils/logger.ts
import { loadAppConfig } from './configLoader';

// 日志模块的使用方法
// // 日志模块
// import { createLogger } from '../utils/logger';
//
// // ✅ 创建属于本模块的日志实例
// const log = createLogger('pixelator');
//
// // 输出日志
// log.info(' 抖动模式：延迟处理');
//
// 🌐 在 Chrome / Edge 中：
// 打开 开发者工具（F12 或右键 → 检查）
// 进入 Console（控制台） 面板
// 看右上角或底部，找到一个下拉菜单，写着：
// Default Levels ✅（正确）
// Verbose
// Info
// Warnings
// Errors
// None
// 选择 Verbose 或 Default Levels


// 日志条目类型
interface LogEntry {
  timestamp: string;
  level: 'debug' | 'info' | 'warn' | 'error';
  module: string;
  message: string;
}

// 内存中的日志缓冲区（所有日志都会被记录到这里）
const logBuffer: LogEntry[] = [];

// 最大日志条数限制（防止内存溢出）
const MAX_LOG_ENTRIES = 10_000;

// 缓存日志配置
let loggingConfig: {
  enabled: boolean;
  level: 'debug' | 'info' | 'warn' | 'error' | 'silent';
  allowedModules: Set<string>;
} | null = null;

// 日志等级映射
const LOG_LEVELS = { debug: 0, info: 1, warn: 2, error: 3, silent: 4 } as const;

// 初始化配置
loadAppConfig()
  .then(config => {
    loggingConfig = {
      enabled: config.logging.enable,
      level: config.logging.level,
      allowedModules: new Set(config.logging.modules),
    };
  })
  .catch(err => {
    console.warn('Failed to load app config for logger:', err);
});

/**
 * 创建一个绑定模块名的日志实例
 * @param moduleName 模块名称，如 'pixelator', 'upload'
 */
export function createLogger(moduleName: string) {
  // 返回一个带有模块上下文的日志对象
    console.log({createLogger_moduleName:moduleName});
  return {
    debug(...args: any[]) {
      if (!shouldLog(moduleName, 'debug')) return;
      console.debug(`🔍 [${moduleName}]`, ' debug', ...args);
      appendToLog({
        timestamp: new Date().toISOString(),
        level: 'debug',
        module: moduleName,
        message: formatArgs(args),
      });
    },
    info(...args: any[]) {
      if (!shouldLog(moduleName, 'info')) return;
      console.info(`ℹ️ [${moduleName}]`, ' info', ...args);
      appendToLog({
        timestamp: new Date().toISOString(),
        level: 'info',
        module: moduleName,
        message: formatArgs(args),
      });
    },
    warn(...args: any[]) {
      if (!shouldLog(moduleName, 'warn')) return;
      console.warn(`⚠️ [${moduleName}]`, ' warn', ...args);
      appendToLog({
        timestamp: new Date().toISOString(),
        level: 'warn',
        module: moduleName,
        message: formatArgs(args),
      });
    },
    error(...args: any[]) {
      // error 总是输出
      console.error(`❌ [${moduleName}]`, ' error', ...args);
      appendToLog({
        timestamp: new Date().toISOString(),
        level: 'error',
        module: moduleName,
        message: formatArgs(args),
      });
    },
  };
}

/**
 * 判断是否应该输出日志
 */
function shouldLog(moduleName: string, level: keyof typeof LOG_LEVELS): boolean {
  if (!loggingConfig) return false; // 配置未加载
  if (!loggingConfig.enabled) return false;
  if (LOG_LEVELS[level] < LOG_LEVELS[loggingConfig.level]) return false;

  // 如果 modules 列表为空，表示所有模块都允许
  if (loggingConfig.allowedModules.size === 0) return true;
  return loggingConfig.allowedModules.has(moduleName);
}

/**
 * 将日志参数转为字符串（简单处理）
 */
function formatArgs(args: any[]): string {
  return args
    .map(arg => {
      if (typeof arg === 'object') {
        try {
          return JSON.stringify(arg);
        } catch (e) {
          return '[Circular]';
        }
      }
      return String(arg);
    })
    .join(' ');
}

/**
 * 写入日志并自动限制缓冲区大小
 */
function appendToLog(entry: LogEntry) {
  logBuffer.push(entry);
  // 超出最大条数时，删除最旧的一条
  if (logBuffer.length > MAX_LOG_ENTRIES) {
    logBuffer.shift();
  }
}

/**
 * 下载当前日志为 .log 文件
 */
export function downloadLog() {
  const now = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
  const filename = `pixify-${now}.log`;

  const content = logBuffer
    .map(
      entry =>
        `[${entry.timestamp}] [${entry.level.toUpperCase()}] [${entry.module}] ${entry.message}`
    )
    .join('\n');

  const blob = new Blob([content], { type: 'text/plain;charset=utf-8' });
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = filename;
  a.click();
  URL.revokeObjectURL(url);
}

/**
 * 获取当前日志缓冲区（只读副本）
 */
export function getLogBuffer(): readonly LogEntry[] {
  return [...logBuffer];
}

/**
 * 清空日志缓冲区
 */
export function clearLogBuffer() {
  logBuffer.length = 0;
}
